home *** CD-ROM | disk | FTP | other *** search
/ Business & Presentations / Business and Presentations - Volume 1 (1995)(Sideface)(NL).iso / gfxapps / dos / viewfont / putbits.asm next >
Assembly Source File  |  1989-08-24  |  4KB  |  176 lines

  1. ; putbits()    - by Mike Salisbury - August 25, 1989
  2. ;
  3. ; call from C as: putbits(x,y,width,height,bufferptr,fgcolor)
  4. ;            x : x position
  5. ;            y : y position
  6. ;            width : character width in bits
  7. ;           height : character height in bits
  8. ;        bufferptr : pointer to byte buffer holding character
  9. ;          fgcolor : foreground color of character (bg stays same)
  10. ;
  11. ; putbits will draw a laserjet formatted character to an ega screen.
  12. ; x does not have to be byte aligned, but I have included an optimized
  13. ; routine for drawing byte aligned characters.  I have only tested
  14. ; this on an EGA, but I believe it should work in VGA mode as well.
  15. ; This is a Turbo Assembler module.  I really only save the registers
  16. ; I have to (CS,SS,DS,BP,SI,DI).  
  17. ;
  18.  
  19. .model small,C
  20. .code
  21.  
  22. PUBLIC putbits
  23.  
  24. putbits PROC
  25. ARG x:WORD,y:WORD,w:WORD,h:WORD,buf:PTR WORD,color:BYTE
  26. LOCAL endinc:WORD,count:WORD,color_shift:WORD,startmask:BYTE,endmask:BYTE
  27. LOCAL shorter:BYTE
  28. USES si,di
  29.  
  30.     mov    ax,0a000h
  31.     mov    es,ax        ; Set up EGA video segment 
  32.     mov    dx,w
  33.     dec    dx
  34.     mov    cl,3
  35.     shr    dx,cl
  36.     inc    dx
  37.     mov    count,dx        ; Save byte size width (rounded up from pixels)
  38.     mov    ax,80
  39.     sub    ax,dx        ; ax = end of line increment 
  40.     mov    endinc,ax
  41.     mov    ax,y
  42.     mov    dx,80
  43.     mul    dx
  44.     mov     dx,x
  45.     mov     cl,3
  46.     shr    dx,cl        ; Save byte size x offset 
  47.     add    ax,dx
  48.     mov    di,ax        ; di = video offset 
  49.  
  50.     mov    cx,h
  51.     jcxz    pbab1
  52.     mov    si,buf        ; si = character data pointer 
  53.     mov     dx,03ceh        ; dx = video port 
  54.     mov     ax,0a05h        ; set Read mode 1, write mode 2 
  55.     out    dx,ax
  56.     mov    ax,0007h        ; Set color don't care for all planes
  57.     out    dx,ax
  58.     mov    ax,x
  59.     and    ax,7            ; check if byte aligned
  60.     jnz    shifted
  61.  
  62.     mov    bl,color
  63.     mov    al,8            ; al = Bit Mask register
  64. pb1:
  65.     push    cx
  66.     mov    cx,count
  67. pb2:
  68.     mov    ah,[si]        ; Byte Aligned
  69.     out    dx,ax
  70.     and    es:[di],bl    ; Draw foreground
  71.     inc    si
  72.     inc    di
  73.     loop    pb2
  74.  
  75.     pop    cx
  76.     add    di,endinc
  77.     loop    pb1
  78.     jmp    pbexit
  79.  
  80. pbab1:
  81.     jmp    pbabort        ; stepping stone to exit for jcxz above
  82.  
  83. shifted:
  84.     mov    ah,00
  85.     mov    shorter,ah    ; initialize shorter flag
  86.     mov    cx,w            ; si,di, and dx already set upon entry
  87.     dec    cx
  88.     and    cx,7
  89.     xor    cl,7
  90.     mov    ah,0ffh
  91.     shl    ah,cl        ; ah = original end mask
  92.     mov    cl,al
  93.     xor    cl,7
  94.     inc    cl            ; cl = bits to shift
  95.     mov    ch,color
  96.     mov    color_shift,cx    ; save color and shift
  97.     mov    al,ah
  98.     cbw                ; ax = original end mask
  99.     mov    bx,00ffh        ; bx = original start mask
  100.     shl    ax,cl
  101.     shl    bx,cl        ; shift both start and end masks
  102.     mov    startmask,bh
  103.     dec    endinc
  104.     or    al,al
  105.     jnz    pb3
  106.     dec    count        ; decrement total byte count
  107.     inc    endinc
  108.     mov    al,01
  109.     mov    shorter,al    ; shifted bytes fit in same space flag
  110.     mov    al,ah
  111. pb3:
  112.     mov    endmask,al    ; both start and end mask are now set
  113.     mov    bx,count
  114.     or    bx,bx
  115.     jnz    pb4
  116.     and    al,startmask
  117.     mov    startmask,al    ; if only one byte, combine masks
  118. pb4:
  119.     mov    cx,h
  120. pbrept:
  121.     push    cx
  122.     mov    cx,color_shift
  123.     mov    bx,count
  124.     lodsw            ; AL = first byte, AH = second byte
  125.     dec    si            ; point back to second
  126.     rol    ax,cl        ; AH = cond+fi, AL = rst+sec
  127.     and    ah,startmask
  128. pb5:
  129.     mov    al,8            ; bit mask register
  130.     out    dx,ax
  131.     and    es:[di],ch    ; write bits
  132.     inc    di
  133.     cmp    bx,1
  134.     jle    pb6
  135.     dec    si
  136.     dec    bx
  137.     lodsw
  138.     rol    ax,cl
  139.     mov    ah,al
  140.     jmp    short pb5        ; go do next byte
  141. pb6:
  142.     or    bx,bx
  143.     jz    pb7            ; if only one byte to start with, do next
  144.     dec    si
  145.     lodsw
  146.     rol    ax,cl
  147.     mov    bl,shorter
  148.     or    bl,bl
  149.     jnz    pb8            ; if shorter flag not set, decrement buffer ptr
  150.     dec    si
  151. pb8:
  152.     mov    ah,al    
  153.     and    ah,endmask
  154.     mov    al,8
  155.     out    dx,ax        ; write ending byte
  156.     and    es:[di],ch
  157.     inc    di
  158. pb7:
  159.     add    di,endinc
  160.     pop    cx
  161.     loop    pbrept        ; repeat for all lines
  162.  
  163. pbexit:
  164.     mov    ax,0005h        ; Reset read/write mode
  165.     out     dx,ax
  166.     mov    ax,0ff08h        ; Reset Bit mask
  167.     out    dx,ax
  168.     mov    ax,00f07h        ; Reset color don't care for all planes
  169.     out    dx,ax
  170. pbabort:
  171.     ret
  172.  
  173. putbits ENDP
  174.  
  175. END
  176.